/**
 * 
 */
package com.furb.pub.persistencia;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.furb.pub.config.Configuracao;
import com.furb.pub.config.EnPropriedade;
import com.furb.pub.controle.produto.ProdutoBase;

/**
 * @author Fernando
 * 
 */
public class ProdutoBaseDao implements IDao<ProdutoBase> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static final String PASTA_PRODUTO_BASE = Configuracao.get(EnPropriedade.PASTA_PRODUTO_BASE.getChave());

    @Override
    public boolean alterar(ProdutoBase obj) {
        ProdutoBase produto = find(obj.getNome());

        excluir(produto);

        return inserir(obj);
    }

    @Override
    public boolean inserir(ProdutoBase obj) {
        if (obj == null || obj.getNome() == null) {
            return false;
        }

        if (arquivoJaExiste(obj)) {
            return false;
        }

        try {
            File file = new File(PASTA_PRODUTO_BASE.concat(obj.getNome().concat(EXTENSAO)));

            FileOutputStream produto = new FileOutputStream(file);

            produto.write(obj.toStringDao().getBytes());

            produto.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return true;
    }

    @Override
    public boolean excluir(ProdutoBase obj) {
        File pasta = new File(PASTA_PRODUTO_BASE);

        try {

            String[] arquivos = pasta.list();

            for (String arquivo : arquivos) {

                if (arquivo.equalsIgnoreCase(obj.getNome().concat(EXTENSAO))) {
                    File arq = new File(PASTA_PRODUTO_BASE.concat(obj.getNome().concat(EXTENSAO)));
                    return arq.delete();
                }

            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return false;
    }

    @Override
    public List<ProdutoBase> listar() {
        List<ProdutoBase> produtos = new ArrayList<>();

        File pasta = new File(PASTA_PRODUTO_BASE);

        try {

            String[] arquivos = pasta.list();

            for (String arquivo : arquivos) {
                if (!FacadeDao.ehArquivoSistema(arquivo)) {
                    continue;
                }

                if (!FacadeDao.ehArquivoSistema(arquivo)) {
                    continue;
                }
                ProdutoBase produto = getProdutoArquivo(arquivo);
                if (produto != null) {
                    produtos.add(produto);
                }
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return produtos;
    }

    @Override
    public ProdutoBase find(String... params) {
        if (params.length != 1) {
            throw new RuntimeException("Err: Deve ser informado apenas o nome do produto para pesquisa.");
        }

        String nomeProduto = params[0];

        File pasta = new File(PASTA_PRODUTO_BASE);

        try {
            String[] arquivos = pasta.list();

            for (String arquivo : arquivos) {
                if (!FacadeDao.ehArquivoSistema(arquivo)) {
                    continue;
                }

                if (!FacadeDao.ehArquivoSistema(arquivo)) {
                    continue;
                }

                ProdutoBase produto = getProdutoArquivo(arquivo);

                if (produto != null && produto.getNome().equalsIgnoreCase(nomeProduto)) {
                    return produto;
                }

            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return null;
    }

    /**
     * @param obj
     * @param pasta
     */
    private boolean arquivoJaExiste(ProdutoBase obj) {
        List<ProdutoBase> produtos = listar();
        for (ProdutoBase produto : produtos) {
            if (produto.equals(obj)) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param setores
     * @param arquivo
     * @throws FileNotFoundException
     * @throws IOException
     */
    private ProdutoBase getProdutoArquivo(String arquivo) throws FileNotFoundException, IOException {
        BufferedReader buffer = new BufferedReader(new FileReader(PASTA_PRODUTO_BASE.concat(arquivo)));

        try {
            String dadosArquivo = buffer.readLine();

            if (dadosArquivo != null) {

                String[] dadosProduto = dadosArquivo.split("#");

                ProdutoBase p = new ProdutoBase();

                p.setNome(dadosProduto[0]);
                p.setDescricao(dadosProduto[1]);
                p.setValor(Float.parseFloat(dadosProduto[2]));

                return p;
            }
        } finally {
            buffer.close();
        }
        return null;
    }
}
